#print(type(vf['Valeur fonciere'][1]))
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.graph_objs as go
from plotly.subplots import make_subplots
path1 = "valeursfoncieres-2023.txt"
vf = pd.read_csv(path1, sep='|')
C:\Users\icee\AppData\Local\Temp\ipykernel_24516\2798943808.py:2: DtypeWarning: Columns (18,23,24,26,28,29,31,32,33,41) have mixed types. Specify dtype option on import or set low_memory=False. vf = pd.read_csv(path1, sep='|')
Dans notre démarche analytique, la première étape cruciale a consisté à examiner la structure et la qualité des données contenues dans le DataFrame vf. Cette étape préliminaire est fondamentale pour assurer l'intégrité et la pertinence de nos analyses ultérieures.
Nous avons rapidement constaté que certaines colonnes, notamment 'Valeur foncière', présentaient des défis en termes de typage. Originellement formatée comme une chaîne de caractères avec des virgules en tant que séparateurs décimaux, cette colonne nécessitait une conversion en type float pour permettre des analyses numériques. Nous avons résolu cette difficulté en remplaçant les virgules par des points, facilitant ainsi sa conversion en un format numérique approprié.
print(vf.columns)
vf["Valeur fonciere"] = vf["Valeur fonciere"].str.replace(',', '.').astype(float)
print(vf.info())
Index(['Identifiant de document', 'Reference document', '1 Articles CGI',
'2 Articles CGI', '3 Articles CGI', '4 Articles CGI', '5 Articles CGI',
'No disposition', 'Date mutation', 'Nature mutation', 'Valeur fonciere',
'No voie', 'B/T/Q', 'Type de voie', 'Code voie', 'Voie', 'Code postal',
'Commune', 'Code departement', 'Code commune', 'Prefixe de section',
'Section', 'No plan', 'No Volume', '1er lot',
'Surface Carrez du 1er lot', '2eme lot', 'Surface Carrez du 2eme lot',
'3eme lot', 'Surface Carrez du 3eme lot', '4eme lot',
'Surface Carrez du 4eme lot', '5eme lot', 'Surface Carrez du 5eme lot',
'Nombre de lots', 'Code type local', 'Type local', 'Identifiant local',
'Surface reelle bati', 'Nombre pieces principales', 'Nature culture',
'Nature culture speciale', 'Surface terrain'],
dtype='object')
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1532718 entries, 0 to 1532717
Data columns (total 43 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Identifiant de document 0 non-null float64
1 Reference document 0 non-null float64
2 1 Articles CGI 0 non-null float64
3 2 Articles CGI 0 non-null float64
4 3 Articles CGI 0 non-null float64
5 4 Articles CGI 0 non-null float64
6 5 Articles CGI 0 non-null float64
7 No disposition 1532718 non-null int64
8 Date mutation 1532718 non-null object
9 Nature mutation 1532718 non-null object
10 Valeur fonciere 1522226 non-null float64
11 No voie 978630 non-null float64
12 B/T/Q 69804 non-null object
13 Type de voie 942670 non-null object
14 Code voie 1521423 non-null object
15 Voie 1521263 non-null object
16 Code postal 1521344 non-null float64
17 Commune 1532718 non-null object
18 Code departement 1532718 non-null object
19 Code commune 1532718 non-null int64
20 Prefixe de section 65750 non-null float64
21 Section 1532622 non-null object
22 No plan 1532718 non-null int64
23 No Volume 3183 non-null object
24 1er lot 496439 non-null object
25 Surface Carrez du 1er lot 149576 non-null object
26 2eme lot 163515 non-null object
27 Surface Carrez du 2eme lot 49495 non-null object
28 3eme lot 29043 non-null object
29 Surface Carrez du 3eme lot 5531 non-null object
30 4eme lot 8894 non-null float64
31 Surface Carrez du 4eme lot 1328 non-null object
32 5eme lot 3742 non-null object
33 Surface Carrez du 5eme lot 405 non-null object
34 Nombre de lots 1532718 non-null int64
35 Code type local 909840 non-null float64
36 Type local 909840 non-null object
37 Identifiant local 0 non-null float64
38 Surface reelle bati 908880 non-null float64
39 Nombre pieces principales 908880 non-null float64
40 Nature culture 1029192 non-null object
41 Nature culture speciale 67006 non-null object
42 Surface terrain 1029192 non-null float64
dtypes: float64(17), int64(4), object(22)
memory usage: 502.8+ MB
None
vf.head(1000)
| Identifiant de document | Reference document | 1 Articles CGI | 2 Articles CGI | 3 Articles CGI | 4 Articles CGI | 5 Articles CGI | No disposition | Date mutation | Nature mutation | ... | Surface Carrez du 5eme lot | Nombre de lots | Code type local | Type local | Identifiant local | Surface reelle bati | Nombre pieces principales | Nature culture | Nature culture speciale | Surface terrain | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 05/01/2023 | Vente | ... | NaN | 1 | 3.0 | Dépendance | NaN | 0.0 | 0.0 | NaN | NaN | NaN |
| 1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 05/01/2023 | Vente | ... | NaN | 1 | 3.0 | Dépendance | NaN | 0.0 | 0.0 | NaN | NaN | NaN |
| 2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 05/01/2023 | Vente | ... | NaN | 1 | 2.0 | Appartement | NaN | 233.0 | 8.0 | NaN | NaN | NaN |
| 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 03/01/2023 | Vente | ... | NaN | 0 | 1.0 | Maison | NaN | 64.0 | 3.0 | S | NaN | 988.0 |
| 4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 05/01/2023 | Vente | ... | NaN | 0 | 3.0 | Dépendance | NaN | 0.0 | 0.0 | S | NaN | 835.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 995 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 25/01/2023 | Vente | ... | NaN | 0 | NaN | NaN | NaN | NaN | NaN | S | NaN | 128.0 |
| 996 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 23/01/2023 | Vente | ... | NaN | 0 | NaN | NaN | NaN | NaN | NaN | AB | NaN | 224.0 |
| 997 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 17/01/2023 | Vente | ... | NaN | 0 | NaN | NaN | NaN | NaN | NaN | AB | NaN | 33.0 |
| 998 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 17/01/2023 | Vente | ... | NaN | 0 | NaN | NaN | NaN | NaN | NaN | AB | NaN | 52.0 |
| 999 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1 | 17/01/2023 | Vente | ... | NaN | 0 | NaN | NaN | NaN | NaN | NaN | AB | NaN | 1587.0 |
1000 rows × 43 columns
Notre analyse préliminaire des données a révélé la présence de plusieurs colonnes non exploitables. Ces colonnes, telles que 'Identifiant de document', 'Reference document', les différentes 'Articles CGI', et d'autres, étaient soit entièrement vides, soit ne présentaient pas d'intérêt manifeste pour notre étude du marché immobilier. Le choix de les éliminer s'est imposé comme une évidence pour clarifier notre dataset et concentrer nos efforts sur les informations pertinentes.
vf_clean = vf.drop(["Identifiant de document",'Reference document', '1 Articles CGI',
'2 Articles CGI', '3 Articles CGI', '4 Articles CGI', '5 Articles CGI', 'Prefixe de section', 'No Volume' ,'1er lot','Surface Carrez du 1er lot', '2eme lot', 'Surface Carrez du 2eme lot',
'3eme lot', 'Surface Carrez du 3eme lot', '4eme lot',
'Surface Carrez du 4eme lot', '5eme lot', 'Surface Carrez du 5eme lot','Identifiant local','Nature culture speciale'], axis=1)
vf_clean['Code commune'] = vf_clean['Code commune'].fillna(0)
vf["Code commune"] = vf["Code commune"].astype(int)
vf_clean.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 1532718 entries, 0 to 1532717 Data columns (total 22 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 No disposition 1532718 non-null int64 1 Date mutation 1532718 non-null object 2 Nature mutation 1532718 non-null object 3 Valeur fonciere 1522226 non-null float64 4 No voie 978630 non-null float64 5 B/T/Q 69804 non-null object 6 Type de voie 942670 non-null object 7 Code voie 1521423 non-null object 8 Voie 1521263 non-null object 9 Code postal 1521344 non-null float64 10 Commune 1532718 non-null object 11 Code departement 1532718 non-null object 12 Code commune 1532718 non-null int64 13 Section 1532622 non-null object 14 No plan 1532718 non-null int64 15 Nombre de lots 1532718 non-null int64 16 Code type local 909840 non-null float64 17 Type local 909840 non-null object 18 Surface reelle bati 908880 non-null float64 19 Nombre pieces principales 908880 non-null float64 20 Nature culture 1029192 non-null object 21 Surface terrain 1029192 non-null float64 dtypes: float64(7), int64(4), object(11) memory usage: 257.3+ MB
path2022 = "valeursfoncieres-2022.txt"
vf_2022 = pd.read_csv(path2022, sep='|')
vf_2022["Valeur fonciere"] = vf_2022["Valeur fonciere"].str.replace(',', '.').astype(float)
vf_clean_2022 = vf_2022.drop(["Identifiant de document",'Reference document', '1 Articles CGI',
'2 Articles CGI', '3 Articles CGI', '4 Articles CGI', '5 Articles CGI', 'Prefixe de section', 'No Volume' ,'1er lot','Surface Carrez du 1er lot', '2eme lot', 'Surface Carrez du 2eme lot',
'3eme lot', 'Surface Carrez du 3eme lot', '4eme lot',
'Surface Carrez du 4eme lot', '5eme lot', 'Surface Carrez du 5eme lot','Identifiant local','Nature culture speciale'], axis=1)
vf_clean_2022['Code commune'] = vf_clean_2022['Code commune'].fillna(0)
vf_2022["Code commune"] = vf_2022["Code commune"].astype(int)
path2019 = "valeursfoncieres-2019.txt"
vf_2019 = pd.read_csv(path2019, sep='|')
vf_2019["Valeur fonciere"] = vf_2019["Valeur fonciere"].str.replace(',', '.').astype(float)
vf_clean_2019 = vf_2019.drop(["Identifiant de document",'Reference document', '1 Articles CGI',
'2 Articles CGI', '3 Articles CGI', '4 Articles CGI', '5 Articles CGI', 'Prefixe de section', 'No Volume' ,'1er lot','Surface Carrez du 1er lot', '2eme lot', 'Surface Carrez du 2eme lot',
'3eme lot', 'Surface Carrez du 3eme lot', '4eme lot',
'Surface Carrez du 4eme lot', '5eme lot', 'Surface Carrez du 5eme lot','Identifiant local','Nature culture speciale'], axis=1)
vf_clean_2019['Code commune'] = vf_clean_2019['Code commune'].fillna(0)
vf_2019["Code commune"] = vf_2019["Code commune"].astype(int)
C:\Users\icee\AppData\Local\Temp\ipykernel_24516\3949750050.py:2: DtypeWarning: Columns (18,23,24,26,28,29,31,33,41) have mixed types. Specify dtype option on import or set low_memory=False. vf_2022 = pd.read_csv(path2022, sep='|') C:\Users\icee\AppData\Local\Temp\ipykernel_24516\3949750050.py:19: DtypeWarning: Columns (18,23,24,26,28,31,33,41) have mixed types. Specify dtype option on import or set low_memory=False. vf_2019 = pd.read_csv(path2019, sep='|')
Cette démarche de nettoyage et de préparation des données est essentielle pour garantir la qualité et la fiabilité de nos analyses. En éliminant les données redondantes ou inutiles, nous avons pu affiner notre focus sur les variables susceptibles d'apporter des insights significatifs sur les tendances et dynamiques du marché immobilier.
Dans le cadre de notre analyse du marché immobilier, nous avons jugé indispensable de procéder à une série de visualisations basiques. Ces visualisations visent à nous fournir une vue d'ensemble du jeu de données à notre disposition, mettant en lumière des aspects clés tels que les surfaces bâties et les valeurs foncières à l'échelle départementale.
vf_clean.head(500)
| No disposition | Date mutation | Nature mutation | Valeur fonciere | No voie | B/T/Q | Type de voie | Code voie | Voie | Code postal | ... | Code commune | Section | No plan | Nombre de lots | Code type local | Type local | Surface reelle bati | Nombre pieces principales | Nature culture | Surface terrain | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 05/01/2023 | Vente | 1070000.0 | 184.0 | NaN | ALL | 0124 | DES HETRES | 1630.0 | ... | 354 | BD | 334 | 1 | 3.0 | Dépendance | 0.0 | 0.0 | NaN | NaN |
| 1 | 1 | 05/01/2023 | Vente | 1070000.0 | 159.0 | NaN | ALL | 0124 | DES HETRES | 1630.0 | ... | 354 | BD | 336 | 1 | 3.0 | Dépendance | 0.0 | 0.0 | NaN | NaN |
| 2 | 1 | 05/01/2023 | Vente | 1070000.0 | 159.0 | NaN | ALL | 0124 | DES HETRES | 1630.0 | ... | 354 | BD | 336 | 1 | 2.0 | Appartement | 233.0 | 8.0 | NaN | NaN |
| 3 | 1 | 03/01/2023 | Vente | 152200.0 | 2914.0 | NaN | RTE | 0107 | DE PONCIN | 1450.0 | ... | 404 | D | 2317 | 0 | 1.0 | Maison | 64.0 | 3.0 | S | 988.0 |
| 4 | 1 | 05/01/2023 | Vente | 269000.0 | 427.0 | T | CHE | 0040 | DE L'AUBEPIN | 1800.0 | ... | 361 | B | 2405 | 0 | 3.0 | Dépendance | 0.0 | 0.0 | S | 835.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 495 | 2 | 04/01/2023 | Vente | 292000.0 | 14.0 | NaN | RUE | 0040 | DES BARONS | 1300.0 | ... | 34 | AK | 327 | 0 | 2.0 | Appartement | 95.0 | 3.0 | S | 236.0 |
| 496 | 2 | 04/01/2023 | Vente | 292000.0 | 14.0 | NaN | RUE | 0040 | DES BARONS | 1300.0 | ... | 34 | AK | 327 | 0 | 2.0 | Appartement | 78.0 | 3.0 | S | 236.0 |
| 497 | 2 | 04/01/2023 | Vente | 292000.0 | 14.0 | NaN | RUE | 0040 | DES BARONS | 1300.0 | ... | 34 | AK | 327 | 0 | 3.0 | Dépendance | 0.0 | 0.0 | S | 236.0 |
| 498 | 3 | 03/01/2023 | Vente | 65000.0 | 169.0 | NaN | CHE | 0470 | DE LA TREDONNIERE | 1400.0 | ... | 93 | A | 1125 | 0 | NaN | NaN | NaN | NaN | S | 29.0 |
| 499 | 3 | 03/01/2023 | Vente | 65000.0 | 153.0 | NaN | RTE | 0471 | DE LA TREDONNIERE | 1400.0 | ... | 93 | A | 1129 | 0 | 2.0 | Appartement | 70.0 | 3.0 | S | 36.0 |
500 rows × 22 columns
Nous avons commencé par concentrer notre attention sur les surfaces réelles bâties. Après avoir filtré les données pour exclure les entrées sans surface bâtie ou avec une surface nulle, nous avons calculé la somme totale des surfaces bâties par département.
df_filtered = vf_clean[(~vf_clean['Surface reelle bati'].isnull()) & (vf_clean['Surface reelle bati'] != 0)]
total_surfaces_baties_par_departement = df_filtered.groupby('Code departement')['Surface reelle bati'].sum()
total_surfaces_baties_par_departement.plot(kind='bar', figsize=(18, 9), color='purple')
plt.xlabel('Département')
plt.ylabel('Total des surfaces réelles bâties')
plt.title('Total des surfaces réelles bâties par département')
plt.show()
La visualisation sous forme de graphique à barres, coloré en violet, a révélé des disparités significatives entre les départements, suggérant des concentrations variables d'activités de construction ou de transactions immobilières.
#2022
df_filtered_2022 = vf_clean_2022[(~vf_clean_2022['Surface reelle bati'].isnull()) & (vf_clean_2022['Surface reelle bati'] != 0)]
total_surfaces_baties_par_departement_2022 = df_filtered_2022.groupby('Code departement')['Surface reelle bati'].sum()
total_surfaces_baties_par_departement_2022.plot(kind='bar', figsize=(16, 9), color='purple')
plt.xlabel('Département')
plt.ylabel('Total des surfaces réelles bâties en 2022')
plt.title('Total des surfaces réelles bâties par département en 2022')
plt.show()
#2019
df_filtered_2019 = vf_clean_2019[(~vf_clean_2019['Surface reelle bati'].isnull()) & (vf_clean_2019['Surface reelle bati'] != 0)]
total_surfaces_baties_par_departement = df_filtered_2019.groupby('Code departement')['Surface reelle bati'].sum()
total_surfaces_baties_par_departement.plot(kind='bar', figsize=(16, 9), color='purple')
plt.xlabel('Département')
plt.ylabel('Total des surfaces réelles bâties en 2019')
plt.title('Total des surfaces réelles bâties par département en 2019')
plt.show()
Dans un deuxième temps, nous avons exploré les surfaces de terrain disponibles pour la construction (nature de culture 'AB'). Ce focus nous a permis d'évaluer les potentialités de développement immobilier par département.
df_ab = vf[vf['Nature culture'] == 'AB']
somme_surfaces_terrain_par_departement = df_ab.groupby('Code departement')['Surface terrain'].sum()
somme_surfaces_terrain_par_departement.plot(kind='bar', figsize=(18, 9), color='orange')
plt.xlabel('Département')
plt.ylabel('Somme des surfaces de terrain (code nature culture "AB")')
plt.title('Total des surfaces disponibles à la construction par département')
plt.show()
Notre graphique représentant la somme des surfaces de terrain disponibles pour la construction (nature de culture 'AB') par département a révélé des données fascinantes et parfois surprenantes. Les départements affichant les valeurs les plus élevées – Loiret (45), Haute-Garonne (31), Vendée (85), Loir-et-Cher (41), et Nord (59) – offrent un panorama diversifié des potentialités de développement immobilier en France.
Le fait que le Loiret se distingue en tête de liste est particulièrement intéressant. Ce département, situé dans la région Centre Val de Loire, n'est pas nécessairement celui auquel on pense en premier pour des projets de développement de grande envergure. Cependant, sa position géographique stratégique, proche de la région Île-de-France, et la disponibilité de vastes étendues de terrain pourraient expliquer cet attrait pour la construction. Cette donnée suggère un potentiel de croissance important pour le Loiret, peut-être en tant que zone de développement périurbain pour ceux qui cherchent à échapper à l'agitation de la capitale tout en restant à proximité.
Le cas du Nord, particulièrement de son centre urbain principal; Lille, est également digne de mention. Malgré le fait que Lille figure parmi les villes les plus peuplées de France, le département dans son ensemble présente un volume élevé de surfaces disponibles pour la construction. Cette observation suggère que, contrairement aux attentes, les zones périphériques de Lille ou d'autres villes du département offrent encore des opportunités de développement immobilier. Cela pourrait indiquer une tendance à l'expansion urbaine ou à l'exploitation de zones jusqu'ici moins densément peuplées.
En somme, ces données révèlent une mosaïque de réalités territoriales en France, avec des départements comme le Loiret et le Nord qui se démarquent de manière inattendue. Ces différences reflètent non seulement des stratégies de développement immobilier variées mais aussi les spécificités géographiques et démographiques de chaque région. Ce constat enrichit notre compréhension du paysage immobilier français, révélant des potentiels de développement diversifiés et parfois surprenants.
Finalement, nous avons étudié les valeurs foncières cumulées par département. Cette analyse est cruciale pour comprendre l'importance économique des transactions immobilières dans chaque région.
somme_valeurs_foncieres_par_departement = vf_clean.groupby(vf_clean['Code departement'])['Valeur fonciere'].sum()
somme_valeurs_foncieres_par_departement.plot(kind='bar', figsize=(18, 9), color='green')
plt.xlabel('Département')
plt.ylabel('Somme des valeurs foncières')
plt.title('Somme des valeurs foncières par département')
plt.show()
L'analyse des valeurs foncières agrégées par département, illustrée par notre graphique en barres, a mis en exergue des disparités significatives à travers le territoire français. En effet, certains départements se distinguent nettement par des valeurs immobilières plus élevées, reflétant potentiellement des marchés immobiliers plus dynamiques et onéreux.
Les départements les plus marquants en termes de valeurs foncières élevées sont, dans l'ordre : Paris (75), Hauts-de-Seine (92), Seine-Saint-Denis (93), Alpes-Maritimes (06), Gironde (33), Bouches-du-Rhône (13) et Rhône (69). Ces départements représentent des pôles économiques et démographiques importants en France, avec Paris et les Hauts-de-Seine formant le cœur de la région Île-de-France, caractérisée par un marché immobilier particulièrement dynamique et des prix élevés. Les Alpes-Maritimes et la Gironde, quant à eux, attirent par leur cadre de vie et leur dynamisme touristique, tandis que les Bouches-du-Rhône et le Rhône se distinguent aussi par des pôles urbains denses et attractifs.
Cette distribution des valeurs foncières souligne non seulement les zones de concentration de richesses immobilières, mais elle reflète également des spécificités régionales, des dynamiques urbaines et des facteurs socio-économiques influençant le marché immobilier. Notre analyse, en révélant ces tendances, offre un aperçu crucial des inégalités territoriales en matière d'investissement immobilier en France.
moyennes_valeurs_foncieres_par_departement = vf.groupby('Code departement')['Valeur fonciere'].mean()
moyennes_valeurs_foncieres_par_departement.plot(kind='bar', figsize=(18, 9), color='blue')
plt.xlabel('Département')
plt.ylabel('Moyenne des valeurs foncières')
plt.title('Moyenne des valeurs foncières par département')
plt.show()
Dans la poursuite de notre analyse, nous nous sommes aventurés dans la création d'une carte choroplèthe représentant la somme des valeurs foncières par département en France. Inspirés par les techniques de visualisation de données utilisées dans le TP14 sur les prédictions des données du COVID-19, nous avons tenté d'appliquer des méthodes similaires pour cartographier les données immobilières.
Nous avons rencontré des difficultés significatives, principalement liées à l'utilisation de Plotly pour la création de la carte choroplèthe. La complexité de l'intégration du GeoJSON, ainsi que la manipulation des données pour qu'elles soient compatibles avec les exigences de Plotly, ont constitué des défis majeurs. Par exemple, aligner les codes des départements entre notre DataFrame et le GeoJSON a nécessité une attention particulière pour garantir l'exactitude de la carte.
Au cours de notre tentative d'aligner nos données immobilières avec le fichier GeoJSON pour la création de notre carte choroplèthe, nous avons été confrontés à une particularité intéressante : celle des codes de département, notamment pour les arrondissements parisiens. Cette spécificité géographique a nécessité une adaptation minutieuse de nos données pour assurer une correspondance précise avec les géocodes du fichier GeoJSON.
Pour illustrer ce défi, prenons l'exemple des codes postaux parisiens. Dans le cadre standard, les codes postaux de Paris vont de 75001 à 75020, représentant les 20 arrondissements. Cependant, dans le fichier GeoJSON utilisé, les arrondissements sont référencés par un code différent, comme '75115' pour le 15ème arrondissement au lieu de '75015'. Cette divergence de codification nécessitait une manipulation spécifique de nos données pour les rendre compatibles avec le fichier GeoJSON.
Pour résoudre ce problème, nous avons adopté la démarche suivante :
Nous avons d'abord extrait les données relatives aux arrondissements parisiens en filtrant notre DataFrame selon les codes postaux parisiens (75001 à 75999). Ensuite, nous avons transformé ces codes postaux pour correspondre à la codification utilisée dans le GeoJSON. Cela a été réalisé en extrayant les deux derniers chiffres du code postal (représentant le numéro de l'arrondissement) et en les précédant de '751'. Par exemple, le code postal '75015' est transformé en '75115'.
sum_valeurs_foncieres = vf_clean.groupby('Code departement')['Valeur fonciere'].sum().reset_index()
min_value = sum_valeurs_foncieres['Valeur fonciere'].min()
max_value = sum_valeurs_foncieres['Valeur fonciere'].max()
geojson_url = 'https://france-geojson.gregoiredavid.fr/repo/departements.geojson'
fig = px.choropleth(sum_valeurs_foncieres,
geojson=geojson_url,
locations='Code departement',
featureidkey="properties.code",
color='Valeur fonciere',
color_continuous_scale="matter",
range_color=(min_value, max_value),
projection="mercator",
title='Somme des valeurs foncières par département en France')
# Afficher la carte
fig.update_geos(fitbounds="locations", visible=False)
fig.show()
df_paris = vf_clean[vf_clean['Code postal'].between(75001, 75999)]
df_paris['Arrondissement'] = df_paris['Code postal'].apply(lambda x: '751' + str(int(x) - 75000).zfill(2))
sum_valeurs_foncieres_paris = df_paris.groupby('Arrondissement')['Valeur fonciere'].sum().reset_index()
geojson_url = 'https://france-geojson.gregoiredavid.fr/repo/departements/75-paris/communes-75-paris.geojson'
fig = px.choropleth(sum_valeurs_foncieres_paris,
geojson=geojson_url,
locations='Arrondissement',
featureidkey="properties.code",
color='Valeur fonciere',
color_continuous_scale="matter",
projection="mercator",
title='Somme des Valeurs Foncières par Arrondissement à Paris')
# Afficher la carte
fig.update_geos(fitbounds="locations", visible=False)
fig.show()
C:\Users\icee\AppData\Local\Temp\ipykernel_24516\622523004.py:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
Nous nous sommes intéressés dans un premier temps à la distribution des volumes de transactions en fonction du département, afin de quantifier puis identifier les tendances du marcher immobilier sur le territoire français. Ensuite, nous avons trouvé pertinent d'étudier l'existence de périodes plus ou moins actives sur le marché (par trimestre), tout en vérifiant si cette périodicité s'appliquait sur la totalité des régions en France. Tous ces phénomènes ou spécificités sont observables sur le graphiques du nombre de transactions par trimestre par département.
vf['Date mutation'] = pd.to_datetime(vf['Date mutation'], errors='coerce')
vf['Mois'] = vf['Date mutation'].dt.month
transactions_par_mois_par_departement = vf.groupby(['Code departement', 'Mois']).size().unstack()
ax = transactions_par_mois_par_departement.plot(kind='bar', stacked=True, figsize=(18, 9))
plt.xlabel('Mois')
plt.ylabel('Nombre de transactions')
plt.title('Nombre de transactions par mois par département')
plt.show()
Face aux difficultés de lisibilité rencontrées avec notre analyse mensuelle des transactions immobilières, marquée par un graphique surchargé, nous avons opté pour une approche trimestrielle. Cette transition stratégique visait à simplifier la visualisation et à améliorer la clarté de nos observations, facilitant ainsi l'identification des tendances d'achat sur le marché immobilier.
vf['Date mutation'] = pd.to_datetime(vf['Date mutation'], errors='coerce')
vf['Trimestre'] = vf['Date mutation'].dt.to_period('Q')
transactions_par_trimestre_par_departement = vf.groupby(['Code departement', 'Trimestre']).size().unstack()
ax = transactions_par_trimestre_par_departement.plot(kind='bar', stacked=True, figsize=(18, 9))
plt.xlabel('Département et Trimestre')
plt.ylabel('Nombre de transactions')
plt.title('Nombre de transactions par trimestre par département')
plt.show()
Dans notre analyse des transactions immobilières de 2023, nous avons observé une activité financière accrue, particulièrement marquée au premier (Q1) et surtout au deuxième trimestre (Q2). Toutefois, cette interprétation doit être nuancée, car nous avons découvert par la suite que notre DataFrame pour 2023 était incomplet, avec une distribution des données qui n'était pas uniforme sur toute l'année. Cette limitation des données a ainsi influencé nos observations initiales, soulignant l'importance de la qualité et de l'exhaustivité des données dans l'analyse des tendances du marché.
En effet, en observant des données s'étalant sur une année entière comme 2022,
vf_clean['Date mutation'] = pd.to_datetime(vf_clean['Date mutation'], format='%d/%m/%Y')
vf_clean['Mois'] = vf_clean['Date mutation'].dt.month
transactions_par_mois = vf_clean.groupby('Mois').size()
couleurs = ['green' if x > 150000 else 'red' for x in transactions_par_mois]
transactions_par_mois.plot.bar(color=couleurs)
plt.title('Nombre de Transactions Immobilières par mois en 2023')
plt.xlabel('Mois')
plt.ylabel('Nombre de Transactions')
plt.show()
vf_clean_2022['Date mutation'] = pd.to_datetime(vf_clean_2022['Date mutation'], format='%d/%m/%Y')
vf_clean_2022['Mois'] = vf_clean_2022['Date mutation'].dt.month
transactions_par_mois_2022 = vf_clean_2022.groupby('Mois').size()
couleurs_2022 = ['green' if x > 400000 else 'red' for x in transactions_par_mois_2022]
transactions_par_mois_2022.plot.bar(color=couleurs_2022)
plt.title('Nombre de Transactions Immobilières par mois en 2022')
plt.xlabel('Mois')
plt.ylabel('Nombre de Transactions')
plt.show()
vf_clean_2019['Date mutation'] = pd.to_datetime(vf_clean_2019['Date mutation'], format='%d/%m/%Y')
vf_clean_2019['Mois'] = vf_clean_2019['Date mutation'].dt.month
transactions_par_mois_2019 = vf_clean_2019.groupby('Mois').size()
couleurs_2019 = ['green' if x > 300000 else 'red' for x in transactions_par_mois_2019] #A Verifier pour le choix du seuil
transactions_par_mois_2019.plot.bar(color=couleurs_2019)
plt.title('Nombre de Transactions Immobilières par mois en 2019')
plt.xlabel('Mois')
plt.ylabel('Nombre de Transactions')
plt.show()
Notre analyse comparative des transactions immobilières pour 2019 et 2022 révèle des dynamiques de marché contrastées. En 2019, le volume des transactions oscillait généralement sous la barre des 300 000 par mois, à l'exception d'un pic notable en décembre, suggérant une activité économique saisonnière. En contraste, 2022 a montré une vitalité remarquable à certains mois, avec des transactions dépassant 400 000 en mars, juin, juillet, septembre et décembre, possiblement influencées par la reprise économique post-Covid et un regain de confiance des investisseurs. En intégrant ces observations avec les tendances du pouvoir d'achat et les performances des indices boursiers européens de ces années, on discerne une corrélation entre les fluctuations du marché immobilier et le contexte économique global. La stabilité de 2019 se traduit par une activité immobilière régulière avec un pic en fin d'année, tandis que la reprise de 2022 a insufflé une dynamique plus prononcée.
Ces tendances soulignent l'importance des facteurs économiques externes dans la compréhension des mouvements du marché immobilier, reflétant les comportements des acheteurs et des investisseurs en réponse aux conditions économiques générales.
Nous abordons maintenant une phase cruciale de notre analyse : l'étude des évolutions des tendances périodiques et territoriales du marché immobilier avant et après la pandémie de Covid-19. Pour cela, nous avons choisi de comparer deux années significatives et espacées – 2019, une année pré-Covid, et 2022, une année post-Covid. Ces années, sélectionnées pour la complétude et la fiabilité de leurs données, nous permettront d'examiner en profondeur les variations dans les volumes de transactions, les tendances dominantes et la répartition des types de biens immobiliers. Cette comparaison approfondie vise à révéler les impacts à long terme de la pandémie sur le marché immobilier et à identifier les changements durables ou temporaires dans les comportements d'achat et de vente.
vf_2019['Date mutation'] = pd.to_datetime(vf_2019['Date mutation'], errors='coerce')
vf_2019['Trimestre'] = vf_2019['Date mutation'].dt.to_period('Q')
vf['Date mutation'] = pd.to_datetime(vf['Date mutation'], errors='coerce')
vf['Trimestre'] = vf['Date mutation'].dt.to_period('Q')
transactions_2023 = vf.groupby('Code departement').size()
departements_12000_plus = transactions_2023[transactions_2023 > 12000].index
vf_filtered = vf[vf['Code departement'].isin(departements_12000_plus)]
transactions_par_trimestre_2019 = vf_2019.groupby(['Code departement', 'Trimestre']).size().unstack()
transactions_par_trimestre_2023 = vf_filtered.groupby(['Code departement', 'Trimestre']).size().unstack()
transactions_comparees = pd.concat([transactions_par_trimestre_2019.add_suffix('_2019'),
transactions_par_trimestre_2023.add_suffix('_2023')], axis=1)
ax = transactions_comparees.plot(kind='bar', stacked=True, figsize=(16, 9))
plt.xlabel('Département et Trimestre')
plt.ylabel('Nombre de transactions')
plt.title('Comparaison du Nombre de Transactions par Trimestre par Département (2019 vs 2023)')
plt.show()
vf.columns
Index(['Identifiant de document', 'Reference document', '1 Articles CGI',
'2 Articles CGI', '3 Articles CGI', '4 Articles CGI', '5 Articles CGI',
'No disposition', 'Date mutation', 'Nature mutation', 'Valeur fonciere',
'No voie', 'B/T/Q', 'Type de voie', 'Code voie', 'Voie', 'Code postal',
'Commune', 'Code departement', 'Code commune', 'Prefixe de section',
'Section', 'No plan', 'No Volume', '1er lot',
'Surface Carrez du 1er lot', '2eme lot', 'Surface Carrez du 2eme lot',
'3eme lot', 'Surface Carrez du 3eme lot', '4eme lot',
'Surface Carrez du 4eme lot', '5eme lot', 'Surface Carrez du 5eme lot',
'Nombre de lots', 'Code type local', 'Type local', 'Identifiant local',
'Surface reelle bati', 'Nombre pieces principales', 'Nature culture',
'Nature culture speciale', 'Surface terrain', 'Mois', 'Trimestre'],
dtype='object')
vf_clean.head(1000)
| No disposition | Date mutation | Nature mutation | Valeur fonciere | No voie | B/T/Q | Type de voie | Code voie | Voie | Code postal | ... | Section | No plan | Nombre de lots | Code type local | Type local | Surface reelle bati | Nombre pieces principales | Nature culture | Surface terrain | Mois | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2023-01-05 | Vente | 1070000.00 | 184.0 | NaN | ALL | 0124 | DES HETRES | 1630.0 | ... | BD | 334 | 1 | 3.0 | Dépendance | 0.0 | 0.0 | NaN | NaN | 1 |
| 1 | 1 | 2023-01-05 | Vente | 1070000.00 | 159.0 | NaN | ALL | 0124 | DES HETRES | 1630.0 | ... | BD | 336 | 1 | 3.0 | Dépendance | 0.0 | 0.0 | NaN | NaN | 1 |
| 2 | 1 | 2023-01-05 | Vente | 1070000.00 | 159.0 | NaN | ALL | 0124 | DES HETRES | 1630.0 | ... | BD | 336 | 1 | 2.0 | Appartement | 233.0 | 8.0 | NaN | NaN | 1 |
| 3 | 1 | 2023-01-03 | Vente | 152200.00 | 2914.0 | NaN | RTE | 0107 | DE PONCIN | 1450.0 | ... | D | 2317 | 0 | 1.0 | Maison | 64.0 | 3.0 | S | 988.0 | 1 |
| 4 | 1 | 2023-01-05 | Vente | 269000.00 | 427.0 | T | CHE | 0040 | DE L'AUBEPIN | 1800.0 | ... | B | 2405 | 0 | 3.0 | Dépendance | 0.0 | 0.0 | S | 835.0 | 1 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 995 | 1 | 2023-01-25 | Vente | 95000.00 | NaN | NaN | NaN | B192 | LES ROUSSETS | 1560.0 | ... | C | 397 | 0 | NaN | NaN | NaN | NaN | S | 128.0 | 1 |
| 996 | 1 | 2023-01-23 | Vente | 195871.98 | NaN | NaN | NaN | B090 | VERS LES BONNES | 1360.0 | ... | A | 3329 | 0 | NaN | NaN | NaN | NaN | AB | 224.0 | 1 |
| 997 | 1 | 2023-01-17 | Vente | NaN | NaN | NaN | NaN | B101 | LE VILLAGE | 1310.0 | ... | B | 1733 | 0 | NaN | NaN | NaN | NaN | AB | 33.0 | 1 |
| 998 | 1 | 2023-01-17 | Vente | NaN | NaN | NaN | NaN | B101 | LE VILLAGE | 1310.0 | ... | B | 1734 | 0 | NaN | NaN | NaN | NaN | AB | 52.0 | 1 |
| 999 | 1 | 2023-01-17 | Vente | NaN | NaN | NaN | NaN | B101 | LE VILLAGE | 1310.0 | ... | B | 1742 | 0 | NaN | NaN | NaN | NaN | AB | 1587.0 | 1 |
1000 rows × 23 columns
vf_filtered = vf[(~vf['Surface reelle bati'].isnull()) & (vf['Surface reelle bati'] != 0)]
vf_filtered['Prix par mètre carré'] = vf_filtered['Valeur fonciere'] / vf_filtered['Surface reelle bati']
moyennes_par_departement = vf_filtered.groupby('Code departement')['Prix par mètre carré'].mean()
moyennes_par_departement.plot(kind='bar', figsize=(18, 9), color='skyblue')
plt.xlabel('Département')
plt.ylabel('Moyenne des prix au mètre carré')
plt.title('Moyenne des prix au mètre carré par département (en excluant NaN et 0)')
plt.show()
C:\Users\icee\AppData\Local\Temp\ipykernel_24516\1200024043.py:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
vf_clean['valeur fonciere'] = vf_clean['Valeur fonciere'].fillna(0)
grouped_vf = vf_clean.groupby('Type local')['Valeur fonciere'].sum()
grouped_vf_percent = grouped_vf / grouped_vf.sum() * 100
small_groups = grouped_vf_percent[grouped_vf_percent < 1]
grouped_vf = grouped_vf.drop(small_groups.index)
if small_groups.sum() > 0:
grouped_vf['Autres'] = small_groups.sum()
plt.figure(figsize=(7,7))
plt.pie(grouped_vf, labels=grouped_vf.index, autopct=lambda p: '{:.1f}%'.format(p) if p > 1 else '')
plt.title('Répartition des valeurs foncières par type de local en 2023')
plt.show()
Notre diagramme en secteurs, révélant la répartition des valeurs foncières par type de local, offre un aperçu précieux des dynamiques du marché immobilier. Surprenamment, les dépendances dominent avec 32,5%, suivies des locaux industriels et commerciaux (27,7%), des appartements (25%), et des maisons (14,8%). Cette visualisation éclaire les secteurs privilégiés des investissements immobiliers, mettant en perspective l'importance relative de chaque catégorie de propriété dans l'économie immobilière française en 2023.
#2022
vf_clean_2022['valeur fonciere'] = vf_clean_2022['Valeur fonciere'].fillna(0)
grouped_vf_2022 = vf_clean_2022.groupby('Type local')['Valeur fonciere'].sum()
grouped_vf_percent_2022 = grouped_vf_2022 / grouped_vf_2022.sum() * 100
small_groups_2022 = grouped_vf_percent_2022[grouped_vf_percent_2022 < 1]
grouped_vf_2022 = grouped_vf_2022.drop(small_groups_2022.index)
if small_groups_2022.sum() > 0:
grouped_vf_2022['Autres'] = small_groups_2022.sum()
plt.figure(figsize=(7,7))
plt.pie(grouped_vf_2022, labels=grouped_vf_2022.index, autopct=lambda p: '{:.1f}%'.format(p) if p > 1 else '')
plt.title('Répartition des valeurs foncières par type de local en 2022')
plt.show()
#2019
vf_clean_2019['valeur fonciere'] = vf_clean_2019['Valeur fonciere'].fillna(0)
grouped_vf_2019 = vf_clean_2019.groupby('Type local')['Valeur fonciere'].sum()
grouped_vf_percent_2019 = grouped_vf_2019 / grouped_vf_2019.sum() * 100
small_groups_2019 = grouped_vf_2019[grouped_vf_percent_2019 < 1]
grouped_vf_2019 = grouped_vf_2019.drop(small_groups_2019.index)
if grouped_vf_2019.sum() > 0:
grouped_vf_2019['Autres'] = small_groups_2019.sum()
plt.figure(figsize=(7,7))
plt.pie(grouped_vf_2019, labels=grouped_vf_2019.index, autopct=lambda p: '{:.1f}%'.format(p) if p > 1 else '')
plt.title('Répartition des valeurs foncières par type de local en 2019')
plt.show()
vf_clean['Type local'].value_counts().plot.pie(autopct='%1.1f%%')
plt.title('Répartition des Types de Locaux')
plt.ylabel('')
plt.figure(figsize=(7,7))
plt.show()
<Figure size 700x700 with 0 Axes>
vf_clean_2022['Type local'].value_counts().plot.pie(autopct='%1.1f%%')
plt.title('Répartition des Types de Locaux en 2022')
plt.ylabel('')
plt.show()
vf_clean_2019['Type local'].value_counts().plot.pie(autopct='%1.1f%%')
plt.title('Répartition des Types de Locaux en 2019')
plt.ylabel('')
plt.show()
L'analyse des répartitions des types de locaux pour les années 2019 et 2022 révèle des changements notables dans la composition du marché immobilier, soulignant l'impact de la pandémie de Covid-19 sur les comportements des acheteurs et des investisseurs.
En 2019, avant la pandémie, le marché était caractérisé par une répartition relativement équilibrée entre maisons (35,5%) et appartements (32,7%), reflétant un marché immobilier diversifié. Les dépendances représentaient 24,7%, et les locaux industriels et commerciaux, bien que ne constituant que 7,1% des transactions, commençaient déjà à montrer leur importance en termes de valeur foncière. Ce paysage pré-Covid dépeint un marché où les investissements étaient répartis de manière assez homogène entre les différents types de biens.
En 2022, la dynamique change significativement. Les dépendances bondissent à 43,9%, ce qui peut être partiellement attribué à la classification des ventes d'appartements à des particuliers en tant que dépendances d'immeubles. Cette augmentation suggère un basculement des préférences vers des biens moins centraux ou traditionnels, possiblement en réponse à un désir accru d'espace et de flexibilité post-confinement. Parallèlement, la part des maisons diminue à 27,6%, et celle des appartements à 23,3%, indiquant peut-être un intérêt décroissant pour les biens classiques en milieu urbain dense.
Malgré leur faible proportion en termes de nombre de transactions (ne dépassant pas 7%), les locaux industriels et commerciaux concentrent une part substantielle des valeurs foncières. Ce constat met en lumière leur rôle essentiel dans l'économie immobilière, reflétant un intérêt marqué des investisseurs pour des biens à haute valeur ajoutée. Ce segment, bien que moins visible en nombre, est donc un moteur significatif du marché en termes de volume financier.
Ces changements dans la répartition des types de locaux entre 2019 et 2022 reflètent une évolution des comportements d'achat et d'investissement dans le secteur immobilier. La période post-Covid a probablement influencé les priorités et les choix des acheteurs, les orientant vers des biens offrant plus d'espace ou de flexibilité, tandis que les investisseurs continuent de privilégier les locaux commerciaux et industriels pour leurs rendements financiers élevés. Ces tendances offrent des informations précieuse sur l'état et la direction future du marché immobilier.
Notre étude du marché immobilier français, en comparant les années pré et post-Covid de 2019 et 2022, a dévoilé certains phénomènes et certaines dynamiques du marché. Dès le début, nous avons confronté des défis liés au typage des données, particulièrement pour la 'Valeur foncière', nécessitant des ajustements méticuleux pour une analyse précise. En cartographiant les valeurs foncières par département, nous avons découvert des disparités notables, révélant des concentrations variables d'activités immobilières. Des départements comme le Loiret et le Nord se sont distingués, indiquant des potentiels de développement inattendus.
L'examen des surfaces disponibles pour la construction a révélé des données surprenantes, avec des départements présentant d'importantes opportunités de développement, malgré des attentes contraires. La création de notre carte choroplèthe a rencontré des difficultés, notamment dans l'alignement des codes de département et dans l'utilisation de Plotly, illustrant les complexités de la visualisation de données géospatiales.
Notre analyse des types de locaux a montré un glissement des préférences post-Covid, avec une augmentation des dépendances et une baisse des transactions de maisons et appartements. Les locaux industriels et commerciaux, bien que moins nombreux, ont représenté une part conséquente des valeurs foncières, soulignant leur importance économique.
En somme, cette étude a mis en lumière les dynamiques changeantes du marché immobilier français, influencées par des facteurs économiques, démographiques et sociétaux. Elle a révélé l'importance des analyses contextuelles et adaptatives pour comprendre les tendances immobilières, offrant une base solide pour les prévisions et stratégies futures.